const express = require('express');
// 导入用来创建JWT字符串的模块
const jsonWebToken = require( 'jsonwebtoken' );

const jc = require( '../utils/jwt-config');
const uid = require( '../utils/uid' );
const User = require( '../models/user' );

const router = express.Router();

router.post( '/user/sign/up' , (req,resp,next) => {
    // 数据校验: 检查 数据是否有效、以及用户名是否被占用
    // 完成数据校验后再调用通过 next 调用下一个中间件
    next();
} , (req,resp) => {
    let { username , password , nickname } = req.body ;
    console.log( username , password , nickname );

    User.create({
        id: uid.idGenerator(),
        username ,
        password, 
        salt: uid.saltGenerator(),
        nickname
    }).then( res => {
        console.log( res );
        resp.json( { success: true , message: '注册成功' } );
    }).catch( error => {
        console.log( error );
        resp.json( { success: false , message: '注册失败' } );
    });
});

router.post( '/user/sign/in' , (req,resp,next) => {
    // 完成数据校验后再调用通过 next 调用下一个中间件
    next();
} , async (req,resp) => {
    let { username , password } = req.body ;
    console.log( username , password );
    // 根据 username 查找数据
    let user = await User.findOne( { username: username } );
    if( user ) {
        // 判断密码是否正确 ( 加盐加密操作请自行完成 )
        if( user.password == password ) {
            // 创建一个纯对象
            let x = Object.create(null);
            // 将 c 对象中的属性复制到 x 对象中
            Object.assign( x , user );
            // 创建JWT字符串
            let s = jsonWebToken.sign( x , jc.secret , { expiresIn: jc.expiresIn } , { algorithm: jc.algorithm } );
            // 在JWT之前添加认证方式
            const token = 'Bearer ' + s ;
            // 将token返回给客户端
            resp.json( { success: true , message: '登录成功' , token: token } );
            return ;
        }
        resp.json( { success: false , message: '密码错误' } );
        return ;
    }
    resp.json( { success: false , message: '用户名错误' } );
});

module.exports = router ;